/**
 * 根据用户角色过滤路由
 */
import { useUserStore } from '@/stores/user'

/**
 * 检查用户是否有访问路由的权限
 * @param {Array} roles 用户角色
 * @param {Object} route 路由对象
 * @returns {Boolean} 是否有权限
 */
export function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  }
  return true
}

/**
 * 过滤路由
 * @param {Array} routes 路由配置
 * @returns {Array} 过滤后的路由
 */
export function filterRoutes(routes) {
  const userStore = useUserStore()
  const roles = userStore.roles || []
  
  // 如果没有角色信息，返回空数组
  if (!roles.length) {
    return []
  }

  // 商户角色不能访问系统管理
  const filteredRoutes = routes.filter(route => {
    // 隐藏指定路由
    if (route.meta && route.meta.hidden) {
      return false
    }
    
    // 系统管理员可以访问所有路由
    if (roles.includes('admin')) {
      return true
    }

    // 系统管理仅对admin开放
    if (route.path === '/system' && roles.includes('merchant')) {
      return false
    }
    
    // 检查角色权限
    if (route.meta && route.meta.roles) {
      return hasPermission(roles, route)
    }
    
    // 检查子路由
    if (route.children && route.children.length) {
      const childrenRoutes = filterRoutesByRoles(route.children, roles)
      if (childrenRoutes.length) {
        route.children = childrenRoutes
        return true
      }
      return false
    }
    
    return true
  })

  return filteredRoutes
}

/**
 * 根据角色过滤子路由
 * @param {Array} routes 路由配置
 * @param {Array} roles 用户角色
 * @returns {Array} 过滤后的路由
 */
function filterRoutesByRoles(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.hidden) {
      return false
    }
    
    // admin角色可以访问所有路由
    if (roles.includes('admin')) {
      return true
    }
    
    // 检查角色权限
    if (route.meta && route.meta.roles) {
      return hasPermission(roles, route)
    }
    
    // 检查子路由
    if (route.children && route.children.length) {
      const childrenRoutes = filterRoutesByRoles(route.children, roles)
      if (childrenRoutes.length) {
        route.children = childrenRoutes
        return true
      }
      return false
    }
    
    return true
  })
} 